﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FirmaKurierska.Models;
using FirmaKurierska.Areas.Admin.Models;
using FirmaKurierska.Areas.Centrala.Models;
using FirmaKurierska.Filters;
using System.Web.Security;

namespace FirmaKurierska.Areas.Centrala.Controllers
{
    public class TwojaCentralaController : Controller
    {
        /// <summary>
        /// Wyświetla listę wszystkich przesyłek które ma obsłużyć centrala
        /// </summary>
        /// <returns>Uporządkowana lista przesyłek</returns>
        public ActionResult Index()
        {
            string uzytkownik = User.Identity.Name;
            var dbContext = new UsersContext();
            var users = dbContext.UserProfiles.ToList();

            //zalogowany uzytkownik
            var user = (from n in users where n.UserName.Equals(uzytkownik) select n).Single();

            //Połączenie z odpowiednia baza
            var db = new PlacowkaEntities();
            var listaCentrali = db.Centrale.ToList();
            var centralaId = user.CentralaId;
            string nazwaCentrali = listaCentrali[centralaId].Nazwa;

            CentralaModelView model = new CentralaModelView();
            model.nazwaCentrali = nazwaCentrali;

            //Lista paczek
            model.paczki = db.Paczka.ToList(); 

            //Lista kierowców
            var kierowcyLoginy = Roles.GetUsersInRole("Kierowca").ToList();
            List<UserProfile> kierowcyCentrali = new List<UserProfile>();
            foreach (string login in kierowcyLoginy)
            {
                UserProfile tmp = (from n in users where n.UserName.Equals(login) select n).Single();
                if (tmp.CentralaId == centralaId)
                {
                    kierowcyCentrali.Add(tmp);
                }
            }
            model.kierowcy = kierowcyCentrali;

            //Lista samochodow
            model.samochody = db.Samochod.ToList();

            return View(model);
        }

        /// <summary>
        /// Wyświetla informację na temat konkretnej przesyłki
        /// </summary>
        /// <param name="id">Id przesyłki</param>
        /// <returns>Widok przesyłki na podstawie modelu</returns>
        public ActionResult Informacje(int id)
        {            
            string uzytkownik = User.Identity.Name;
            var dbContext = new UsersContext();
            var users = dbContext.UserProfiles.ToList();

            //zalogowany uzytkownik
            var user = (from n in users where n.UserName.Equals(uzytkownik) select n).Single();

            //Połączenie z odpowiednia baza
            var dBCentrale = new PlacowkaEntities();
            var listaCentrali = dBCentrale.Centrale.ToList();
            var centralaId = user.CentralaId;
            string nazwaCentrali = listaCentrali[centralaId].Nazwa;
            var dB = new PlacowkaEntities();

            InformacjePrzesylka model = new InformacjePrzesylka();
            var paczkitmp = dB.Paczka.ToList();

            var paczki = (from n in paczkitmp where n.centrala_id == centralaId select n).ToList();

            //Nadawca
            try
            {
                var nadawcaId = (from n in paczki where n.pid == id select n.nadawca_id).Single();
                model.nadawca = (from n in users where n.UserId == nadawcaId select n).Single();           

                //Odbiorca
                model.odbiorca = (from n in paczki where n.pid == id select n.Adresat).Single();

                //Nazwa statusu
                int status = (from n in paczki where n.pid == id select n.status).Single();
                model.status = status.ToString();
            }
            catch (Exception) {
                return RedirectToAction("Index");
            }

            //Samochod
            try
            {
                model.samochod = (int)(from n in paczki where n.pid == id select n.kierowca_id).Single();
            }
            catch (Exception) { }
            return View(model);
        }

        /// <summary>
        /// Wywołuje algorytmy jednobazowe
        /// </summary>
        /// <returns>Obecny widok</returns>
        public ActionResult przypiszKurierow()
        {
            OperacjeJednobazowe operacje = new OperacjeJednobazowe();
            operacje.przelicz();
            return View();
        }

        /// <summary>
        /// Wywołuje algorytmy wielobazowe
        /// </summary>
        /// <returns>Obecny widok</returns>
        public ActionResult przypiszTransfery()
        {
            OperacjeWielobazowe operacje = new OperacjeWielobazowe();
            operacje.przelicz();
            return View();
        }
    }
}
